package com.cn.icss.controller;

import com.cn.icss.service.IHelloService;
import com.cn.icss.service.impl.HelloServiceImpl;
import com.cn.icss.vo.User;
import com.cn.icss.vo.common.ResponseResult;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.core.paragetter.Para;
import com.jfinal.json.FastJson;
import live.autu.plugin.jfinal.swagger.annotation.Api;
import live.autu.plugin.jfinal.swagger.annotation.ApiImplicitParam;
import live.autu.plugin.jfinal.swagger.annotation.ApiImplicitParams;
import live.autu.plugin.jfinal.swagger.annotation.ApiOperation;
import live.autu.plugin.jfinal.swagger.config.RequestMethod;

import java.util.UUID;

/**
 * @中软华腾软件系统有限公司,未经授权不得擅自传播
 * @类描述:
 * @类名称:HelloController
 * @作者: Administrator
 * @编辑时间: 2020/4/1 12:00
 * @版本: 1.0
 */
//@Api(description = "测试接口")
public class HelloController extends Controller {

    // 记住如果是接口或者抽象类一定要注解声明好类型或者用配置配置好，要不然报错，除非是实现类的直接注入
    @Inject(HelloServiceImpl.class)
    private IHelloService helloService;
    // 不写明注解参数的话只能是实现类，如果要是注入接口或者抽象类提前要有配置在constant中AopManager.me().addMapping(Service.class, MyService.class);
    @Inject
    private HelloServiceImpl helloServiceimpl;

    // 消灭前面一大堆，直接写路径覆盖掉前面设置的basePath+viewPath
    public void index(){
        helloService.sayHello();
        helloServiceimpl.sayHello();
        render("/index.html");
    }

    @ApiOperation(methods= RequestMethod.GET, produces="application/json;charset=UFT-8")
    @ApiImplicitParams({
            @ApiImplicitParam(name="userName",required=false, description="这是姓名")
    })
    public void testSwagger(){
        String name = getPara("userName");
        renderJson(ResponseResult.ok(name));
    }

    // 直接返回不行的，不像springmvc，所以一定要使用render函数进行路由
    @Deprecated
    public String go(){
        return "/index.html";
    }

    public void showew(){
        super.renderQrCode("jzw", 100, 100,'M');
    }

    public void addUser(@Para("") User user){
        System.out.println("后台获取到用户User:" + user);
        renderJson(user);
    }
    // 还可以不传参数，但是接收直接转换为Bean的参数getBean 与上面等价
    public void addUser2(){
        User user = super.getBean(User.class);// 如果没有第二个参数，那么就是传bean.属性名
        System.out.println(user);
        // 如果是第二个传参为"" 就直接传属性名
        User user2 = super.getBean(User.class, "");
        System.out.println(user2);
        renderJson(user2);
    }

    // 记住如果是对Restful直接使用int或者无参数的接收
    // 如果是对表单或者?的，使用字符串接收 如下, 那么方法上参数就是对象或者没有就这两种
    public void getUser(){
        String userId = getPara("userId");
        System.out.println("获取数据:"+userId);
        System.out.println(getParaToInt("userId"));
        renderText(userId);
    }

    // 接收rest 记住rest传参只能是/xx/a-b-c最后的传参只能这样格式(默认的样式)
    public void getUserRest(){
        System.out.println(getPara(0));
        renderText(getPara(0));
    }

    // 这种可以直接获取传参的JSON
    public void getUserJson(){
        // 传参中直接传JSON对象
        String jsonStr = getRawData();
        System.out.println(jsonStr);
        User user = FastJson.getJson().parse(jsonStr, User.class);
        System.out.println(user);
        renderText(jsonStr);
    }
    // 设置request的属性
    public void setUserAttr(){
        String userId = super.getPara("userId");
        System.out.println(userId);
        setAttr("haha'", userId); // 这个方法等价于set方法 其实就是调用request.setAttr
        renderJson("设置成功");
    }

    //String template = baseViewPath(这个在路由里面设置) + viewPath(路由中设置) + view(函数返回值)
    // 模板渲染 render("abc.html") 将指向 webapp 目录下面的 "/_view/index/abc.html" 这个模板。
    public void showHtml(){
        String name = super.getPara("name");
        System.out.println(name);
        super.set("name", name);
        // 如果是玩模板应该就只能servlet-jsp这种方式
        render("test.html");
    }

    public void login(){

        String uuid = UUID.randomUUID().toString().replaceAll("-","");
        System.out.println(uuid);
        setSessionAttr("sid", uuid);
        System.out.println(getSessionAttr("sid").toString());
        render("/index.html");
    }

    public void getAllCountry(){
        helloService.getAllCountries();
        renderText("获取成功");
    }

}
